package com.web.kftsdk.entity;

import com.web.kftsdk.common.util.str.StringUtils;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.NotBlank;

import java.util.Map;
import java.util.TreeMap;

/**
 *
 * @author Welcome Chen
 * @date 2018-08-16
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class KppAppDto {
    private String reqNo;
    private String service;
    private String version;
    private String charset;

    /**
     * 参数名称:商户身份ID
     * 可否为空：否
     * 参数描述：签约快付通的唯一用户编号,最长20位纯数字组成的字符
     */
    @NotBlank
    private String merchantId;

    /**
     * 参数名称:二级商户ID
     * 可否为空：是
     * 参数描述：一级商户下的二级子商户号，调用“二级商户入驻接口”生成。
     */
    private String secMerchantId;

    /**
     * 参数名称:交易编号
     * 可否为空：否
     * 参数描述：用于标识商户发起的一笔交易
     */
    @NotBlank
    private String orderNo;

    /**
     * 参数名称:终端IP
     * 可否为空：否
     * 参数描述：APP和网页支付提交用户端ip，主扫支付填调用付API的机器IP
     */
    @NotBlank
    private String terminalIp;

    /**
     * 参数名称:异步支付通知回调地址
     * 可否为空：否
     * 参数描述：必须可直接访问的url，不能携带参数。
     */
    @NotBlank
    private String notifyUrl;

    /**
     * 参数名称:商品ID
     * 可否为空：否
     * 参数描述：此id为二维码中包含的商品ID，商户自行定义。
     */
    @NotBlank
    private String productId;

    /**
     * 参数名称:交易金额
     * 可否为空：否
     * 参数描述：此次交易的具体金额,单位:分,不支持小数点
     */
    @NotBlank
    private String amount;

    /**
     * 参数名称:币种
     * 可否为空：否
     * 参数描述：指定交易所使用的币种, 具体见第5.3.2章节
     */
    @NotBlank
    private String currency;

    /**
     * 参数名称:商品描述
     * 可否为空：否
     * 参数描述：简要概括此次交易的内容.可能会在用户App上显示
     */
    @NotBlank
    private String tradeName;

    /**
     * 参数名称:商品详情
     * 可否为空：可空
     * 参数描述：对商品的描述
     */
    private String remark;

    /**
     * 参数名称:商户方交易时间
     * 可否为空：否
     * 参数描述：此次交易在商户发发起的时间,注意此时间取值一般为商户方系统时间而非快付通生成此时间
     */
    @NotBlank
    private String tradeTime;

    /**
     * 参数名称:APP Id
     * 可否为空：否
     * 参数描述：商户APP账号ID。
     */
    @NotBlank
    private String subAppId;

    /**
     * 参数名称:支付渠道
     * 可否为空：否
     * 参数描述：如微信、支付宝等，具体见第5.3.1章节目前只支持微信。
     */
    @NotBlank
    private String bankNo;

    /**
     * 参数名称:是否是S0支付
     * 可否为空：可空
     * 参数描述：是否是S0支付，1：是；0：否。默认否。如果是S0支付，金额会实时付给商户。需经快付通审核通过后才可开展此业务。如果无此业务权限，此参数为1，则返回失败。
     */
    private String isS0;

    /**
     * 参数名称:是否担保
     * 可否为空：可空
     * 参数描述：是否担保交易，1：是;0：否。默认否。与isS0互斥
     */
    private String isGuarantee;

    /**
     * 参数名称:是否分账
     * 可否为空：可空
     * 参数描述：是否分账交易，1：是;0：否。默认否。
     */
    private String isSplit;

    /**
     * 参数名称:分账详情
     * 可否为空：可空
     * 参数描述：如果是分账交易必填。示例：[{\"merchantId\":\"000010001000000161\",\"amount\":\"100\",\"remark\":\"有线电视费\"},{\"merchantId\":\"000010001000000162\",\"amount\":\"200\",\"remark\":\"宽带费\"}]说明：1：merchantId代表签约快付通的唯一用户编号。如果是平台商发起分账，merchantId必须是平台商下的二级商户id，如果是直连商户发起分账交易，merchantId必须是和快付通签约的直连商户2：amount的合计总额必须等于本交易的交易金额。 3：remark为分账交易备注。
     */
    private String splitInfo;
    /**
     * 参数名称:语言
     * 是否必须：否
     * 参数描述：用于支持不同语言.java国际化中标准的locale值，如zh_CN表示中文，en表示英文；
     */
    private String language;

    /**
     * 参数名称:调用端IP
     * 是否必须：否
     * 参数描述：快付通服务器对应的IP
     */
    private String callerIp;

    /**
     * 参数名称:参数签名算法
     * 是否必须：否
     * 参数描述：RSA
     */
    private String signatureAlgorithm;

    /**
     * 参数名称:签名值
     * 是否必须：否
     * 参数描述：所有需要参与签名的请求参数,通过指定的签名算法计算后得出的字符串.具体见第5章节，使用商户私钥进行加签
     */
    private String signatureInfo;



    /**
     * 参数名称:交易状态
     * 是否必须：否
     * 参数描述：交易结果,详见第5.2.1章节。失败详情参见failureDetails
     */
    private String status;

    /**
     * 参数名称:错误码
     * 是否必须：可空
     * 参数描述：
     */
    private String errorCode;

    /**
     * 参数名称:失败详情
     * 是否必须：可空
     * 参数描述：失败详情，对于快付通内部异常时会截取512长度，其他长度无限制
     */
    private String failureDetails;

    /**
     * 参数名称:账务日期
     * 是否必须：可空
     */
    private String checkDate;

    /**
     * 对账状态
     */
    private String reconStatus;

    /**
     * 参数名称:支付渠道流水
     * 是否必须：可空
     * 参数描述：支付宝渠道：支付宝交易流水，微信渠道：微信交易流水
     */
    private String channelNo;

    /**
     * 参数名称:应结订单金额
     * 是否必须：否
     * 参数描述：应结订单金额=订单金额-非充值代金券。此次交易的实际金额,单位:分,不支持小数点
     */
    private String settlementAmount;

    private String json;
    private Map map;

    public Map toMap(String service){
        Map<String, String> map = new TreeMap<>();
        if(!StringUtils.isBlank(reqNo)){
            map.put("reqNo",reqNo);
        }
        this.service=service;
        map.put("service",this.service);
        map.put("version",version);
        map.put("charset",charset);
        map.put("language",language);
        map.put( "merchantId",merchantId );
        map.put( "secMerchantId",secMerchantId );
        map.put( "orderNo",orderNo );
        map.put( "terminalIp",terminalIp );
        map.put( "notifyUrl", notifyUrl);
        map.put( "productId",productId );
        map.put( "amount",amount );
        map.put( "currency",currency );
        map.put( "tradeName",tradeName );
        map.put( "remark",remark );
        map.put( "tradeTime",tradeTime );
        map.put( "subAppId",subAppId );
        map.put( "bankNo",bankNo );
        map.put( "isS0",isS0 );
        map.put( "isGuarantee", isGuarantee);
        map.put( "isSplit", isSplit);
        map.put( "splitInfo", splitInfo);
        map.put( "language",language );
        if(!StringUtils.isBlank(callerIp)){
            map.put("callerIp",callerIp);
        }
        return map;
    }


}
